在弱點管理的範疇中,我們經常可聽聞幾個辭彙,例如源碼檢測、弱點掃描、滲透測試,他們之間的差異是什麼,在網頁程式開發領域中,這三種測試系統弱點的方式該怎麼應用?導入的時機均不相同嗎?
隨著測試角度不同,源碼檢測、弱點掃描、滲透測試可以為網頁程式找出不同層面的問題。開發者或承包商應就程式功能與目的檢視自己的安全需求,應用不同的檢測方式強化自身安全。
源碼檢測是最基本的網頁程式稽核方式。透過對原始碼的檢查,挖掘已知或未知的網頁問題。常見的作法是利用人力檢測,如果是寫程式能力有自信的開發團體,是由公司自有的資深工程師負責,對品質要求較為嚴格的單位,則會雇用資安專家協助進行。但近年來各種工具已將檢測準確率提升到九成以上,故也有許多公司採用自動工具進行檢測。
開發過程中隨時都需要的源碼檢測
就像時下線上遊戲最流行的公測(找玩家試完以進行測試),或一般程式開發流程中的Beta Test要求(由使用者需求檢查功能是否正常),安全源碼檢測需要第三方檢查,方能找出所有安全瑕疵。較為不同的是,遊戲公測或Beta Test 通常是程式完工前的最後一關,源碼檢測卻是開發流程中每一階段都需要作完,才能移至下一階段的必備手續。專屬的資安人員是較為適合的人選,但如前所述,成本較高,尤其是時間成本。源碼檢測人員必須從一開始就全程參與開發專案,才能減少解析與了解程式的時間與精力。而開發案規模愈大,跨越的模組愈多,或者使用的不同類型的語言或系統愈多,對源碼檢測人員的專業要求也高,難有人力能夠及時處理百萬行以上的程式碼。有鑒於此,各種源碼檢測的自動工具紛紛出爐,輔助源碼檢測人員或開發團隊大量且快速地檢查。
動態與靜態的源碼檢測法
早期的源碼檢測工具採取傳統的模式比對法(Pattern Matching),亦即黑名單表列。將安全漏洞中常用到的語法表列出來,由現有程式碼或編譯碼中找尋是否有相符字串。雖然效率上較省時間,效果上卻與由一般非資安專業的程式設計員檢查的結果相距不遠,誤報率與漏報量均高居不下。這也是程式開發者普遍不信任自動工具的主因。
第二代的源碼檢測自動工具改朝向動態檢視發展,亦即避過純白箱測試的理念,將設計好的惡意資料透過模擬編譯器輸入程式中執行,檢視執行時的環境行為(像是記憶體或檔案狀態)及程式回應(例如錯誤訊息),以確認運作是否正常。動態檢視的好處是可以預見程式碼在未來真實環境下的執行狀況,及早修正避免,但測試條件的選擇仍為重點。在實作上,動態源碼檢測工具必須與開發環境緊密結合,因此在程式碼開發過程之外,開發人員必須花額外精神學習如何使用源碼檢測工具,進而查出源碼檢測工具與開發工具之間的相容性,並且及時除錯。
近年來,靜態源碼檢測法的概念由學術界研討後,揚棄既有的模式比對法,而採用流程相依檢視法(flow-sensitive),成為新一代的源碼檢測主流。原理在於,依程式控制流程與資料控制流程來發覺異常問題的進入點,針對這些進入點檢測是否已經處理︰若發現未經處理,則標記為問題進入點(控制元件或資料)。在流程中,下游元件若使用到問題控制元件或問題資料,而且發現未經處理,則也將被標上問題進入點(控制元件或資料),以此類推,直至檢視至末碼。
流程檢視後,即可得到完整的問題進入點列表。更方便的是,程式設計人員可能只要解決最早的問題進入點,與其相關的問題進入點,都可獲得解決,在追蹤與修補上都更為直覺。
流程檢視的概念完全除去了漏報問題,而這方面的問題只發生在開發政策與人為決策上,而非程式語法本身。同時,靜態源碼檢測也採取與開發小組隔開的獨立運作的方式,除了可將各獨立模組的源碼合併,進行整合檢測外,也讓開發人員不必擔心工具操作或維護問題,專注於檢測報告上,因此有越來越多廠商改採此類靜態源碼檢測工具。
除了開發過程外,開發完成後的檢測亦日趨重要。因為作業需求的複雜化,許多程式開發逐漸由自建轉為委外,但以往在驗收時,常常只能著重於功能驗測。隨著資安問題日益嚴重,源碼檢測也開始被要求納入重點驗收項目。
因為此類驗測是由使用者角度出發,所以驗收或稽核單位通常會採用人工與自動工具並行制。稽核員將程式碼送入自動工具中,針對產出報告中的弱點人工逐一驗證確認,然後再交由承包商修復複檢,以快速達到驗測目的。而在稽核單位與承包商均無法確實修復時,源碼檢測專家也可提供修復協助或諮詢,目的均在於設法避免程式碼中的資安問題。
弱點掃描的目標是系統錯誤
採用源碼檢測的同時,驗收與稽核單位也會一併執行弱點掃描與滲透測試。源碼檢測著重在程式碼安全,弱點掃描則是著眼在環境與系統上的錯誤。
舉例而言,你的團隊設計出「完全」安全的購物車程式,卻因為系統管理者誤將密碼設成空白,或因為安裝在舊版的網站伺服器上,而遭入侵竄改,就像「百萬金門三夾牆」的故事一樣,豈不倒霉?除了網頁程式碼本身的問題之外,使用者設定疏漏與安裝環境的強固性也是最常被入侵的環節,行之有年的弱點掃描就是最方便的檢查工具。
弱點掃描工具是以使用者角度來審視整個專案計畫,不只是程式本身,也包含整個執行環境。傳統弱點掃描工具只針對作業系統與網站伺服器本身的問題,近年來網頁安全意識抬頭,專業的網頁弱點掃描工具也逐漸興起,IBM及HP等大廠都將網頁弱點掃描工具納入軟體測試套件中。除了檢查已知的網站伺服器漏洞外,網頁弱點掃描工具主要作用是模擬惡意使用者的瀏覽行為,爬蒐受測程式的所有連結後,對所有可輸入的連結送出惡意數值,觀察記錄回應狀態。
網頁弱點掃描工具也會猜測所有隱藏目錄、管理後臺、程式備份檔或資料庫檔案位置。對於可登入的頁面,則進行密碼猜測的工作,以便檢測管理者的安全警覺性。弱點掃描由上層角度來找出整套系統的安全性,測試的出發點較為接近真實世界,是十分確實的黑箱測試工具。
以已知弱點為驗證基礎的滲透測試
而比弱點掃描更上一層的則為滲透測試。
傳統對滲透測試的觀念為驗證所知弱點的可行性,以駭客或惡意使用者的角度對目標進行驗證,分析受測系統的風險層級。許多滲透測試自動工具亦圍繞此一傳統觀念寫成,反而局限了滲透測試的目的,讓終端使用者誤以為滲透測試只針對軟體廠商或系統開發商,而非找出整體問題。
事實上,滲透測試所看的層面更廣。滲透測試所針對的目標是受測系統與所有大環境的運作,像是程式中的邏輯問題(而非程式問題)、系統運作流程瑕疵、社交工程漏洞等,都包含在滲透測試範疇內。舉例而言,中國駭客最愛使用的「旁注攻擊」,就是利用同一主機上的不同網站進行入侵。也許你提供的網站程式十分安全,但安裝於同一服務主機上的其他應用程式漏洞百出,致使主機遭到入侵,則你的程式再安全,也避無可避。再看另一個例子,刑事局曾破獲一個案件,虛擬寶物商利用遊戲公司與電信公司間「小額付費機制」認證漏洞,大量詐買遊戲點數換取虛擬貨幣,作為網路洗錢之用,這就是另一種跨系統的安全問題。也因此,滲透測試難以被工具取代,必須使用人力協助進行。
滲透測試人員檢視整個系統的運作邏輯,來思索可能侵入的點。例如:他們會模擬一般使用者登入,試圖取得其他使用者權限;或者是在網路上搜尋受測單位及人員的可用資訊,像是使用員工郵件信箱,猜測後臺登入名稱;他們也會將受測目標公司的英文名稱、地址或管理者寵物的小名,加入密碼猜測字典中;或者是寄出信件給程式開發人員或管理者,騙取源碼或登入密碼;滲透測試人員會試圖在上傳頁面中上傳木馬,看看網頁程式是否未過濾或掃毒。
上述這些都是滲透測試時可能進行的活動,依受測目標的狀況會產生各種不同的滲透測試腳本。滲透測試人員將自己視為駭客,用異於常人的觀點來試探系統可靠度,從而找出所有潛在的威脅。